home *** CD-ROM | disk | FTP | other *** search
Text File | 1991-07-25 | 5.6 KB | 238 lines | [TEXT/PJMM] |
- { ******************************************************** }
- { "wBMBalloons.p" }
- { }
- { by John A. Love, III [ Washington Apple Pi Users' Group] }
- { }
- { using Symantec's "THINK Lightspeed Pascal", v 3.02 }
- { }
- { ******************************************************** }
-
-
- UNIT wBMBalloons;
-
- INTERFACE
-
- USES
- Types, Quickdraw, Menus, TextEdit, Traps, GestaltEqu, Balloons, wBMGlobals, wBMMiscSubs, wBMScrollSubs;
-
-
- FUNCTION HelpManagerActive: BOOLEAN;
- FUNCTION BalloonsOn: BOOLEAN;
- FUNCTION BalloonShowing: BOOLEAN;
- PROCEDURE FindAndShowDynamicBalloons (balloonsUp: BOOLEAN; window: WindowPtr);
- PROCEDURE HideBalloons (balloonsUp: BOOLEAN);
- PROCEDURE ShowBalloons (balloonsUp: BOOLEAN);
- PROCEDURE ResetBalloons (balloonsUp: BOOLEAN);
-
-
-
-
- IMPLEMENTATION
-
-
-
-
- FUNCTION HelpManagerActive: BOOLEAN;
- { Do we have a machine on which the Help Manager exists ??? }
-
- CONST
- _Gestalt = $A1AD;
-
- VAR
- myFeature: LONGINT;
-
- BEGIN
-
- HelpManagerActive := FALSE; { Pessimism is the order of the day !!! }
-
- IF TrapAvailable(_Gestalt) THEN
- IF Gestalt(gestaltHelpMgrAttr, myFeature) = noErr THEN
- IF BitTst(@myFeature, 31 - gestaltHelpMgrPresent) THEN
- HelpManagerActive := TRUE;
-
- END; { HelpManagerActive }
-
-
-
- FUNCTION BalloonsOn: BOOLEAN;
- { Has the user selected "Show Balloons" ??? }
-
- BEGIN
-
- BalloonsOn := HelpManagerActive & HMGetBalloons;
-
- END; { BalloonsOn }
-
-
-
- FUNCTION BalloonShowing: BOOLEAN;
- { Is a Balloon currently showing ??? }
-
- BEGIN
-
- BalloonShowing := HelpManagerActive & HMIsBalloon;
-
- END; { BalloonShowing }
-
-
-
- PROCEDURE FindAndShowDynamicBalloons (balloonsUp: BOOLEAN; window: WindowPtr);
-
- CONST
- stdWDEF = 0;
- defVar = 0;
- notMine = -1;
-
- VAR
- i: INTEGER;
- mouse: Point;
- savePort: GrafPtr;
- inRect: BOOLEAN;
-
- FUNCTION ShowMyNewBalloon (altRect: Rect; tipProc: Ptr; strID, strIndex, theProc, variant, method: INTEGER): OSErr;
-
- VAR
- helpMsg: HMMessageRecord;
- tip: Point;
-
- BEGIN
-
- LocalGlobal(altRect);
- WITH altRect DO { Center the tip. }
- SetPt(tip, (right + left) DIV 2, (bottom + top) DIV 2);
- ;
- WITH helpMsg DO { Fill in HMMessageRecord. }
- BEGIN
- hmmHelpType := khmmStringRes;
- hmmStringRes.hmmResID := strID;
- hmmStringRes.hmmIndex := strIndex;
- END; { WITH helpMsg)}
- ;
- ShowMyNewBalloon := HMShowBalloon(helpMsg, tip, NIL, tipProc, theProc, variant, method);
-
- END; { ShowMyNewBalloon }
-
-
- FUNCTION RemoveMyOldBalloon: OSErr;
-
- BEGIN
-
- RemoveMyOldBalloon := noErr;
- IF lastBalloon <> notMine THEN { All MINE !! }
- IF PtInRect(mouse, window^.portRect) THEN
- { If NOT ...for example, if in window's title bar, }
- { the Finder will remove my balloon for me. }
- RemoveMyOldBalloon := HMRemoveBalloon;
-
- END; { RemoveMyOldBalloon }
-
-
- BEGIN { FindAndShowDynamicBalloons }
-
- { Only the NEW windows can be dynamically sized . The initial rDocProc }
- { window is a static window; however, both window types have hot rects }
- { that vary in size with the presence of a Radius BIG screen. }
- { Therefore , I do NOT have 'hwin' and 'hrct' resources in this file . }
-
- IF balloonsUp & (window <> NIL) THEN
- IF NOT currDA & myAppl THEN { Neither a DA nor suspended. }
- IF NOT StillDown THEN { My scrolling WMB. }
- BEGIN
-
- { GetPort(savePort); -- already = FrontWindow }
- { SetPort(window); }
- GetMouse(mouse);
- inRect := FALSE;
-
- IF NOT EventAvail(updateMask, Event) THEN
- IF PtInRect(mouse, WBMrect) THEN
- FOR i := 0 TO 2 DO
- IF PtInRect(mouse, dynamicBalloons[i].dynamicR) THEN
- BEGIN
- IF i <> lastBalloon THEN
- BEGIN
- IF RemoveMyOldBalloon = noErr THEN
- ;
- IF ShowMyNewBalloon(dynamicBalloons[i].dynamicR, NIL, dynamicBalloons[i].dynamicStrID, dynamicBalloons[i].dynamicStrIndex, stdWDEF, defVar, kHMSaveBitsNoWindow) = noErr THEN
- lastBalloon := i;
- END; { i <> lastBalloon }
- ;
- inRect := true;
- Leave;
- END; { NOT EventAvail & Cursor in WBMrect }
-
- IF NOT inRect THEN
- BEGIN
- IF RemoveMyOldBalloon = noErr THEN
- ;
- lastBalloon := notMine;
- END;
-
- { SetPort(savePort); -- see above }
-
- END { Initial 3 IFs }
- ELSE
- lastBalloon := notMine;
-
- END; { FindAndShowDynamicBalloons }
-
-
-
- PROCEDURE HideBalloons (balloonsUp: BOOLEAN);
-
- VAR
- soWhat: OSErr;
-
- BEGIN
-
- IF balloonsUp THEN
- BEGIN
- IF BalloonShowing THEN
- { Get the daggum monster out of the way !! }
- { Used "hmSaveBitsNoWindow option" so bits }
- { are restored withOUT an update Event. }
- soWhat := HMRemoveBalloon;
- ;
- { Okay, I've restored the bits. However, now }
- { I've got to temporarily disable Balloon Help }
- { until I leave with a Mouse Up Event or finish }
- { with whatever: }
- soWhat := HMSetBalloons(false);
- ;
- lastBalloon := -1;
- END; { "Show Balloons" active }
-
- END; { HideBalloons }
-
-
-
- PROCEDURE ShowBalloons (balloonsUp: BOOLEAN);
- { NOW !!! I can safely re-enable Balloon Help: }
-
- VAR
- soWhat: OSErr;
-
- BEGIN
-
- IF balloonsUp THEN
- soWhat := HMSetBalloons(true);
-
- END; { ShowBalloons }
-
-
-
- PROCEDURE ResetBalloons (balloonsUp: BOOLEAN);
-
- BEGIN
-
- IF balloonsUp THEN
- ShowBalloons(true)
- ELSE
- HideBalloons(HelpManagerActive);
-
- END; { ResetBalloons }
-
-
-
-
- END. { UNIT = wBMBalloons }